import 'dart:ffi';

/// 事件处理器集合
class MopExtWechatHandlers {
  /// 转发小程序处理器
  final MopExtWechatForwardAppletHandler? forwardAppletHandler;

  /// 获取用户信息处理器
  final MopExtWechatGetUserInfoHandler? getUserInfoHandler;

  /// 获取用户 Profile 处理器
  final MopExtWechatGetUserProfileHandler? getUserProfileHandler;

  /// 客服会话处理器
  final MopExtWechatContactHandler? contactHandler;

  /// 获取手机号处理器
  final MopExtWechatGetPhoneNumberHandler? getPhoneNumberHandler;

  /// 启动 APP 处理器
  final MopExtWechatLaunchAppHandler? launchAppHandler;

  /// 反馈处理器
  final MopExtWechatFeedbackHandler? feedbackHandler;

  /// 选择头像处理器
  final MopExtWechatChooseAvatarHandler? chooseAvatarHandler;

  /// 构造函数
  const MopExtWechatHandlers({
    this.forwardAppletHandler,
    this.getUserInfoHandler,
    this.getUserProfileHandler,
    this.contactHandler,
    this.getPhoneNumberHandler,
    this.launchAppHandler,
    this.feedbackHandler,
    this.chooseAvatarHandler,
  });
}

class MopExtWechatHandlerResult {
  /// 事件处理结果（成功或者失败）
  final bool success;
  /// 数据
  final Map<String, dynamic>? data;

  MopExtWechatHandlerResult({
    required this.success,
    required this.data,
  });
}

/// 转发事件的 Handler
abstract class MopExtWechatForwardAppletHandler {
  /// 转发事件：如需自己实现，请重写函数，否则走内置的逻辑
  ///
  /// [contentInfo] 小程序相关信息，包含小程序id、名称、图标、截图等
  /// return: MopExtWechatHandlerResult
  /// 只要success字段即可
  Future<MopExtWechatHandlerResult> forwardApplet(Map<String, dynamic> contentInfo);
}

/// 获取用户信息的 Handler
abstract class MopExtWechatGetUserInfoHandler {
  /// 获取用户信息：如需自己实现，请重写函数，否则走内置的逻辑
  ///
  /// [appletInfo] 小程序信息
  /// return: MopExtWechatHandlerResult
  Future<MopExtWechatHandlerResult> getUserInfo(Map<String, dynamic> appletInfo);
}

abstract class MopExtWechatGetUserProfileHandler {

  /// 获取用户Profile：如需自己实现，请重写函数，否则走内置的逻辑
  ///
  /// [appletInfo] 小程序信息
  /// return: MopExtWechatHandlerResult
  Future<MopExtWechatHandlerResult> getUserProfile(Map<String, dynamic> appletInfo);
}

abstract class MopExtWechatContactHandler {
  /// 打开客服会话：如需自己实现，请重写函数，否则走内置的逻辑
  ///
  /// [appletInfo] 小程序信息
  /// [sessionFrom] 会话来源
  /// [sendMessageTitle] 会话内消息卡片标题
  /// [sendMessagePath] 会话内消息卡片点击跳转小程序路径
  /// [sendMessageImg] 会话内消息卡片图片
  /// [showMessageCard] 是否显示消息卡片
  /// return: MopExtWechatHandlerResult
  /// 只要success字段即可
  Future<MopExtWechatHandlerResult> contact(Map<String, dynamic> appletInfo,
      String sessionFrom,
      String sendMessageTitle,
      String sendMessagePath,
      String sendMessageImg,
      bool showMessageCard,);

}

abstract class MopExtWechatGetPhoneNumberHandler {

  /// 获取手机号：如需自己实现，请重写函数，否则走内置的逻辑
  /// return: MopExtWechatHandlerResult
  ///  result.data参考格式如下（可由宿主App自定义）：
  ///  {
  ///     detail = {
  ///         code = ""换取用户手机号的动态令牌" // 这里参考微信小程序的数据格式，如果宿主app不支持动态令牌功能，可以自定义格式
  ///     }
  ///  }
  /// [appletInfo] 小程序信息
  Future<MopExtWechatHandlerResult> getPhoneNumber(Map<String, dynamic> appletInfo);
}


abstract class MopExtWechatLaunchAppHandler {
  /// 打开APP：如需自己实现，请重写函数，否则走内置的逻辑
  ///
  /// [appletInfo] 小程序信息
  /// [appParameter] 打开APP时传递的参数
  /// return: MopExtWechatHandlerResult
  /// result.data, 参考格式如下
  /// {
  ///   'detail': {
  ///     ...
  ///   }
  /// }
  Future<MopExtWechatHandlerResult> launchApp(Map<String, dynamic> appletInfo,
      String appParameter,);
}


abstract class MopExtWechatFeedbackHandler {
  /// 打开反馈页面：如需自己实现，请重写函数，否则走内置的逻辑
  ///
  /// [appletInfo] 小程序信息
  /// return MopExtWechatHandlerResult: 只要success字段即可
  Future<MopExtWechatHandlerResult> feedback(Map<String, dynamic> appletInfo);
}


abstract class MopExtWechatChooseAvatarHandler {
  /// 选择头像：如需自己实现，请重写函数，否则走内置的逻辑
  ///
  /// [appletInfo] 小程序信息
  /// return: MopExtWechatHandlerResult
  /// result.data返回的数据参考格式如下，detail是必须的字段，detail内部的数据可以自定义
  ///  {
  ///     detail = {
  ///         avatalUrl = "头像地址",
  ///         ....
  ///         ....
  ///     }
  ///  }
  Future<MopExtWechatHandlerResult> chooseAvatar(Map<String, dynamic> appletInfo);

}